/**
 * @文件名 LoginSessionListener.java
 * @包名 com.nutz.cngrain.sys.listener
 * @说明 用户登录在线管理
 * @作者 wdfang
 * @时间 2013-1-27 上午1:58:25
 * @版本 V1.0
 */
package com.ykfk.cngrain.tbw;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.log4j.Logger;

/**
 * @类名 LoginSessionListener
 * @描述 用户登录监听
 * @作者 wdfang
 * @日期 2013-1-27 上午1:58:25 ========修改日志=======
 * 
 */
public class LoginSessionListener implements HttpSessionListener {
	/**
	 * 保存 sessionId和userName 的映射(sessionid,userName)
	 */
	public static Map<String, String> hUserName = new ConcurrentHashMap<String, String>();
	/**
	 * 集合对象,保存session 对象的引用(sessionid,session)
	 */
	public static Map<String, HttpSession> htsession = new ConcurrentHashMap<String, HttpSession>();
	/**
	 * 保存用户操作员代码与session id 的关联
	 */
	public static Map<String, Integer> mpOper = new ConcurrentHashMap<String, Integer>();
	/**
	 * logger 日志
	 */
	static Logger logger = Logger.getLogger(LoginSessionListener.class);
	/**
	 * 
	 * @名称 sessionCreated
	 * @描述 session创建时的操作
	 * @参数 
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	public void sessionCreated(HttpSessionEvent se) {

	}
	/**
	 * 
	 * @名称 sessionDestroyed
	 * @描述 session 销毁时的操作
	 * @参数 
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	public void sessionDestroyed(HttpSessionEvent se) {
		//sessionId和userName 的映射(sessionid,userName)去除
		hUserName.remove(se.getSession().getId());
		//session 对象的引用(sessionid,session)去除
		htsession.remove(se.getSession().getId());
		//用户操作员代码与sessionid关联去除
		mpOper.remove(se.getSession().getId());
	}
	/**
	 * 
	 * @名称 isOnline
	 * @描述 判断是否在线
	 * @参数 sUserName 操作员唯一编号
	 * @返回值 boolean true 在线，false 不在线并添加
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	public static boolean isOnline(HttpSession session, String sUserName) {
		boolean flag = false;
		if (hUserName.containsValue(sUserName)) {
			flag = true;
		} else {
			flag = false;
			hUserName.put(session.getId(), sUserName);
			htsession.put(session.getId(), session);
		}
		return flag;
	}
	/**
	 * 
	 * @名称 isAlreadyEnter
	 * @描述 判断是否登录过，登录过的移除后，重新添加，否则直接加入
	 * @参数 
	 * @返回值 boolean ture 登录过，false 没有登录
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isAlreadyEnter(HttpSession session, String sUserName) {
		boolean flag = false;
		if (hUserName.containsValue(sUserName)) {
			flag = true;
			Iterator iter = hUserName.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry entry = (Map.Entry) iter.next();
				Object key = entry.getKey();
				Object val = entry.getValue();
				if (((String) val).equals(sUserName)) {
					iter.remove();
					HttpSession ses = (HttpSession) htsession.get(key);
					htsession.remove(key);
					ses.removeAttribute(SysParameter.sessionObj); 
					break;
				}
			}
			hUserName.put(session.getId(), sUserName);
			htsession.put(session.getId(), session);
		} else {
			// 如果该用户没登录过，直接添加现在的sessionID和username
			flag = false;
			hUserName.put(session.getId(), sUserName);
			htsession.put(session.getId(), session);
		}
		System.err.println(htsession.size());
		System.err.println(hUserName.size());
		return flag;
	}
	/**
	 * 
	 * @名称 doRemove
	 * @描述 把session移除
	 * @参数 
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	@SuppressWarnings("rawtypes")
	public static boolean doRemove(HttpSession session, String sUserName) {
		boolean flag = false;
		if (hUserName.containsValue(sUserName)) {
			flag = true;
			Iterator iter = hUserName.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry entry = (Map.Entry) iter.next();
				Object key = entry.getKey();
				Object val = entry.getValue();
				if (((String) val).equals(sUserName)) {
					hUserName.remove(key);
					htsession.remove(key);
				}
			}
		}
		return flag;
	}
	/**
	 * 
	 * @名称 isAddSessionToMap
	 * @描述 判断用户是否在session列表中存在
	 * @参数 
	 * @返回值 boolean true：存在，false：不存在但已添加
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	public static boolean isAddSessionToMap(HttpSession session, String sUserName) {
		boolean flag = false;
		if (hUserName.containsValue(sUserName)) {
			flag = true;
		} else {
			flag = false;
			hUserName.put(session.getId(), sUserName);
			htsession.put(session.getId(), session);
		}
		return flag;
	}
	/**
	 * 
	 * @名称 getSessionBySessionId
	 * @描述 根据sessionId获得session
	 * @参数 
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-27 上午2:03:39
	 */
	public static HttpSession getSessionBySessionId(String sessionid) {
		HttpSession session = (HttpSession) htsession.get(sessionid);
		return session;
	}
}
